#include <iostream>

using namespace std;
using ll=long long;
const int N=2*1e5+10;
int a[N];
ll pre[N];
struct node{
	int l,r;
	ll lmax,rmax,sum;
}tr[N*4];
void pushup(int u)
{
	tr[u].sum=tr[u<<1].sum+tr[u<<1|1].sum;
	tr[u].lmax=max(tr[u<<1].sum+tr[u<<1|1].lmax,tr[u<<1].lmax);
	tr[u].rmax=max(tr[u<<1].rmax+tr[u<<1|1].sum,tr[u<<1|1].rmax);
}

void build(int u,int l,int r)
{
	if(l==r)
	{
		tr[u]={l,r,a[l],a[l],a[l]};
	}
	else{
		tr[u]={l,r};
		int mid=l+r>>1;
		build(u<<1,l,mid);
		build(u<<1|1,mid+1,r);
		pushup(u);
	}
}

node query(int u,int l,int r)
{
	if(tr[u].l>=l && tr[u].r<=r)
	{
		return tr[u];
	}
	
	int mid=tr[u].l+tr[u].r>>1;
	if(r<=mid)
	{
		return query(u<<1,l,r);
	}
	else if(l>mid)
	{
		return query(u<<1|1,l,r);
	}
	else{
		auto left=query(u<<1,l,r);
		auto right=query(u<<1|1,l,r);
		
		
		node ret={l,r,max(left.lmax,left.sum+right.lmax),max(right.rmax,right.sum+left.rmax),left.sum+right.sum};
		return ret;
				
	}

		
}
int main()
{
	int n,q;
	cin>>n>>q;
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		pre[i]=pre[i-1]+a[i];
	}
	
	build(1,1,n);
	while(q--)
	{
		int a,b,c,d;
		scanf("%d%d%d%d",&a,&b,&c,&d);
		cout<<query(1,a,b).rmax+query(1,c,d).lmax+pre[c-1]-pre[b]<<endl;
	}
	return 0;
}
